.data
	msg: 		.asciiz "numero para fatorial "
	resultado: 	.ascii "o fatorial do numero é: "
	input: 		.word 0
	ans: 		.word 0
	
	
.text
	.globl main
	main:
		
		#display msg
		li $v0, 4
		la $a0, msg
		syscall
		
		#get input
		li $v0, 5
		syscall
		sw $v0, input
		
		#call fatorial
		lw $a0, input    #passar o input como argumento
		jal factorial
   
		sw $v0, ans	#v0 ans
		
		#display resultado
		li $v0, 4
		la $a0, resultado
		syscall
		
		#display ans
		li $v0, 1
		lw $a0, ans
		syscall
		
		#end
		li $v0, 10
		syscall
		
	.globl factorial	
	factorial:
		#a0=n
		subu $sp, $sp, 8   #criar espaço no slack para as variaveis locais
		sw $ra, 0($sp)     #saving the return
		sw $s0, 4($sp)     #saving the num from recursion
		
		#base case
		li $v0, 1
		beq $a0, 0, done   #if n=0, acaba
		
		#(n-1)
		move $s0, $a0
		sub $a0, $a0, 1
		jal factorial
		
		mul $v0, $s0, $v0
		
	done:
		lw $ra, 0($sp)
		lw $s0, 4($sp)   #loading value 
		addu $sp, $sp, 8
		
		jr $ra
		
		
		
		
		
		